package cn.sw.file.controller;
import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import io.minio.errors.MinioException;
import io.minio.PutObjectArgs;
import org.apache.commons.compress.utils.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * public-readonly-file
 */
@SpringBootApplication
@RestController
@RequestMapping("minio")
public class MinioDemoController {
 
    @Resource
    private MinioClient minioClient;
 
    @Value("${minio.bucket-name}")
    private String bucketName;
 
    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            InputStream inputStream = file.getInputStream();
            minioClient.putObject(//执行上传操作
                    PutObjectArgs.builder()
                            .bucket(bucketName) //上传的存储桶名称
                            .object(file.getOriginalFilename())//设置上传后的对象名，使用原始文件名
                            .stream(inputStream, inputStream.available(), -1)//传入文件输入流，并指定其大小和分片大小（-1 表示自动分片）
                            .contentType(file.getContentType())//设置文件的内容类型
                            .build()
            );
            return "File uploaded successfully!";
        } catch (MinioException | IOException | NoSuchAlgorithmException | InvalidKeyException e) {
            e.printStackTrace();
            return "Error uploading file to MinIO: " + e.getMessage();
        }
    }


    @GetMapping("/download")
    public void downloadFile(@RequestParam("fileName") String fileName, HttpServletResponse response) {
        try {
            InputStream inputStream = minioClient.getObject(
                    GetObjectArgs.builder()
                            .bucket(bucketName)
                            .object(fileName)
                            .build()
            );

            response.setContentType("application/octet-stream");//设置响应内容类型为 application/octet-stream，表示二进制流，适合文件下载。
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);//设置响应头 Content-Disposition，指示浏览器以“另存为”方式下载文件，并指定默认文件名。
            IOUtils.copy(inputStream, response.getOutputStream());//使用 Apache Commons IO 的 IOUtils.copy 方法，将从 MinIO 获取的输入流复制到 HTTP 响应的输出流中。
            response.flushBuffer();// 确保所有缓冲的数据都被发送到客户端。
        } catch (Exception e) {
            e.printStackTrace();
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }


}